/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.Util;
import jp.ize.ux.UXObject;
import jp.ize.ux.UXScalable;
import jp.ize.ux.UXResource;
import jp.ize.ux.UXMouseEvent;
import jp.ize.ux.UXKeyboardEvent;
import jp.ize.ux.UXPoint;
import jp.ize.ux.UXController;
import jp.ize.ux.UXInteraction;
import jp.ize.ux.UXFocusManager;
import jp.ize.ux.states.UXLinearState;
import jp.ize.ux.acts.Act;
import jp.ize.ux.acts.LinearAct;
import jp.ize.ux.components.UXComponent;

#if flash9
import flash.ui.Keyboard;
#elseif flash
import flash.Key;
#end
// }}}
// {{{ class UXButtonResource extends UXComponentResource
/**
 * UXButtonResource クラス<br>
 * UXButtonコンポーネントに利用されるリソース群です。
 */
class UXButtonResource extends UXComponentResource
{
	// {{{ public var background(default, default) : UXScalable
	/**
	 * ボタンの背景となるコンポーネントです。
	 */
	public var background(default, default) : UXScalable;
	// }}}
	// {{{ public var press(default, default) : UXResource
	/**
	 * ボタンが押された時に利用されるリソースです。
	 */
	public var press(default, default) : UXResource;
	// }}}
	// {{{ public var depress(default, default) : UXResource;
	/**
	 * ボタンが放された時に利用されるリソース。
	 */
	public var depress(default, default) : UXResource;
	// }}}
	// {{{ public var select(default, default) : UXResource
	/**
	 * 選択されている状態の時に利用されるリソース
	 */
	public var select(default, default) : UXResource;
	// }}}
	// {{{ public var deselect(default, default) : UXResource;
	/**
	 * 選択が解除された時に利用されるリソース。
	 */
	public var deselect(default, default) : UXResource;
	// }}}
}
// }}}
// {{{ enum UXButtonActEvent
enum UXButtonActEvent
{
	/** dicideアクトが始まった時に発生するイベントです。 */
	DICIDE_START;
	/** ハイライトアクトが始まったときに発生するイベントです。 */
	HIGHLIGHT_START;
	/** 選択アクトが始まったときに発生するイベントです。 */
	SELECT_START;
	/** フォーカスアクトが始まった時に発生するイベントです。 */
	FOCUS_START;
}
// }}}
// {{{ class UXButtonAct extends ActSubject<UXButtonActEvent>
/**
 * UXButtonAct クラス<br>
 * UXButtonのデフォルトアクションです。
 */
class UXButtonAct extends ActSubject<UXButtonActEvent>
{
	// {{{ public function new()
	/**
	 * コンストラクタです。<br>
	 */
	public function new()
	{
		super();
	}
	// }}}
	// {{{ public function decide( s : UXButtonState ) : Void
	/**
	 * ボタンが実行された時のデフォルトアクションです。
	 */
	public function dicide( s : UXButtonState ) : Void
	{
		if (s.resource.press.component() == null) {
			s.background == s.resource.press.component();
		}
		s.resource.press.applyFilter( s.background );
		s.resource.press.tween( s.background );
	}
	// }}}
	// {{{ public function uplight( s : UXButtonState ) : Void
	/**
	 * ボタンをハイライトした時のデフォルトアクションです。
	 */
	public function uplight( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function downlight( s : UXButtonState ) : Void
	/**
	 * ボタンのハイライトを解除した時のデフォルトアクションです。
	 */
	public function downlight( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function select( s : UXButtonState ) : Void
	/**
	 * ボタンを選択した時のデフォルトアクションです。
	 */
	public function select( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function deselect( s : UXButtonState ) : Void
	/**
	 * ボタンの選択を解除した時のデフォルトアクションです。
	 */
	public function deselect( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function focus( s : UXButtonState ) : Void
	/**
	 * ボタンがフォーカスされた時のデフォルトアクションです。
	 */
	public function focus( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function unfocus( s : UXButtonState ) : Void
	/**
	 * ボタンのフォーカスが解除された時のデフォルトアクションです。
	 */
	public function unfocus( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function disable( s : UXButtonState ) : Void
	/**
	 * 無効にした時のデフォルトアクションです。
	 */
	public function disable( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function enable( s : UXButtonState ) : Void
	/**
	 * 有効にした時のデフォルトアクションです。
	 */
	public function enable( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function show( s : UXButtonState ) : Void
	/**
	 * 表示された時のデフォルトアクションです。
	 */
	public function show( s : UXButtonState ) : Void
	{
	}
	// }}}
	// {{{ public function hide( s : UXButtonState ) : Void
	/**
	 * 非表示になった時のデフォルトアクションdす。
	 */
	public function hide( s : UXButtonState ) : Void
	{
	}
	// }}}
}
// }}}
// {{{ class UXButtonCoState
class UXButtonCoState
{
	// {{{ public var focused(default, default) : Bool
	/**
	 * このボタンにフォーカスが当たっているかどうかを取得、または設定します。
	 */
	public var focused(default, default) : Bool;
	// }}}
	// {{{ public var highlighted(default, default) : Bool
	/**
	 * このボタンがハイライトされているかどうかを取得、または設定します。
	 */
	public var highlighted(default, default) : Bool;
	// }}}
	// {{{ public var selected(default, default) : Bool
	/**
	 * このボタンが選択されているかどうかを取得、または設定します。
	 */
	public var selected(default, default) : Bool;
	// }}}
}
// }}}
// {{{ enum UXButtonExclusiveState
/**
 * UXButtonの各種状況を表現します。
 */
enum UXButtonExclusiveState
{
	/** 初期化状態にある事を意味します。*/
	INIT;
	/** 無効になっている事を意味します。*/
	DISABLE;
	/** 有効になっている事を意味します。パラメーターでは、フォーカスやハイライトの状況を保持します。*/
	ENABLE ( flags : UXButtonCoState );
}
// }}}
// {{{ class UXButtonState extends UXLinearState
/**
 * UXButtonState クラス<br>
 * UXButtonの現在の状態を表すオブジェクトです。
 * UXButtonStateはテキストやアイコンを直線的に配置するため、UXLinearStateを用います。
 */
class UXButtonState extends UXLinearState
{
	// {{{ public var resource( default, default ) : UXButtonResource;
	/**
	 * ボタンの描画に使用するリソースです。
	 */
	public var resource( default, default ) : UXButtonResource;
	// }}}
	// {{{ public var background( default, default ) : UXComponent
	/**
	 * 背景コンポーネントです。
	 */
	public var background( default, default ) : UXScalable;
	// }}}
	// {{{ public var label(default, default) : UXLabel
	/**
	 * ボタン上に文字を表示するコンポーネントです。
	 */
	public var label(default, default) : UXLabel;
	// }}}
	// {{{ public var testAttribute(default, default) : UXTextAttribute
	/**
	 * テキストの表示属性です。
	 */
	public var testAttribute(default, default) : UXTextAttribute;
	// }}}
	// {{{ public var icon( default, default ) : Image;
	/**
	 * ボタン上に画像を表示するアイコンです。デフォルトではnullです。
	 */
	public var icon( default, default ) : UXImage;
	// }}}
	// {{{ public var act(default, null) : UXButtonAct
	/**
	 * デフォルトのボタンの動きです。
	 */
	public var acts(default, null) : UXButtonAct;
	// }}}
	// {{{ public var condition( default, default) : UXButtonExclusiveState;
	/**
	 * enableかどうかやフォーカスが当たっているかなど各種状況を保持する変数です。
	 */
	public var condition( default, default) : UXButtonExclusiveState;
	// }}}
	// {{{ public var focusManager(default, default) : UXFocusManager
	/**
	 * このコンポーネントが属するフォーカスグループの管理オブジェクトです。
	 * このコンポーネントがフォーカスを受け取らない場合はnullです。
	 */
	public var focusManager(default, default) : UXFocusManager;
	// }}}
	// {{{ public function new( startp : UXPoint, endp : UXPoint, width : Float )
	/**
	 * コンストラクタです。
	 */
	public function new( startp : UXPoint, endp : UXPoint, width : Float )
	{
		super( startp, endp, width );
		// 
		// TODO
		// リソースの設定
		// デフォルト値の設定
	}
	// }}}
	// {{{ private function attachResource() : Void
	/**
	 * ボタンに対するグローバルなリソースをresourceプロパティに取得する関数です。
	 */
	private function attachResource() : Void
	{
	}
	// }}}
}
// }}}
// {{{ class UXButton extends UXComponent
/**
 * UXButton クラス<br>
 * ボタンを実現するコンポーネントです。ボタンは一つの背景コンポーネントと複数の前面コンポーネン
 * トがLinearLayoutされているものと定義されています。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id: UXButton.hx 20 2009-02-04 08:23:19Z yimai.v $<br>
 */
class UXButton extends UXComponent
{
	// {{{ properties

	private var _state : UXButtonState;

	// }}}
	// {{{ public var ctrl(default, null) : UXController<UXButtonState>
	/**
	 * インタラクションを司るコントローラー。
	 */
	public var ctrl(default, null) : UXController<UXButtonState>;
	// }}}
	// {{{ public function new( ?label : String = "" )
	/**
	 * コンストラクタです。
	 * @param text: ボタンのテキストです。省略可能です。
	 * @param icon: ボタンに表示する画像です。省略可能です。
	 */
	public function new( ?text : String = "", ?icon : UXImage = null )
	{
		super();

		// 実装例
		// レイアウトとアクトのインスタンスを作ります。
		_state = new UXButtonState( new UXPoint(), new UXPoint(), 0. );
		_state.label.text = text;
		_state.icon = icon;
		ctrl = new UXController<UXButtonState>( _state );
		ctrl.addInteraction( new UXButtonDicideInteraction() );
	}
	// }}}
	// {{{ public function refreshResource() : Void
	/**
	 * ボタンに対するグローバルなリソースを再取得する関数です。
	 */
	public function refreshResource() : Void
	{
	}
	// }}}
	// {{{ public function update( updator : UXButtonState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXButtonState -> Void ) : Void
	{
		updator( _state );
	}
	// }}}
}
// }}}
// {{{ class UXButtonInitInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonInitInteraction クラス<br>
 * ボタンの初期化に対するデフォルトインタラクションです。
 */
class UXButtonInitInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
// {{{ class UXButtonDicideInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonDicideInteraction クラス<br>
 * ボタンの実行に対するデフォルトインタラクションです。
 */
class UXButtonDicideInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
// {{{ class UXButtonHighlightInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonHighlightInteraction クラス<br>
 * ボタンのhighlight/delightに対するデフォルトインタラクションです。
 */
class UXButtonHighlightInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
// {{{ class UXButtonFocusInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonFocusInteraction クラス<br>
 * ボタンのfocus/unfocusに対するデフォルトインタラクションです。
 */
class UXButtonFocusInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
// {{{ class UXButtonSelectInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonSelectInteraction クラス<br>
 * ボタンのselect/unselectに対するデフォルトインタラクションです。
 */
class UXButtonSelectInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
// {{{ class UXButtonPushInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonPushInteraction クラス<br>
 * ボタンのpress/depressに対するデフォルトインタラクションです。
 */
class UXButtonPushInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
// {{{ class UXButtonLayoutInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonLayoutInteraction クラス<br>
 * ボタンの文字やアイコンを整列するデフォルトインタラクションです。
 */
class UXButtonLayoutInteraction extends UXInteraction<UXButtonState>
{
	// {{{ properites

	private var _layout : LinearAct;

	// }}}
	// {{{ public function verticalLayout(  state : UXButtonState ) : Void
	/**
	 * 子コンポーネントを縦に並べます。
	 */
	private function verticalLayout( state : UXButtonState ) : Void
	{
		state.startp = new UXPoint( state.background.width / 2, 0);
		state.endp = new UXPoint( state.background.width / 2, state.background.height / 2);
		var f = _layout.layout( new ActParameter( 0., jp.ize.ux.acts.ActTransition.Linear ) );
		f( state ); 
	}
	// }}}
	// {{{ private function horizontalLayout( state : UXButtonState ) : Void
	/**
	 * 子コンポーネントを横に並べます。
	 */
	private function horizontalLayout( state : UXButtonState ) : Void
	{
		state.startp = new UXPoint( 0, state.background.height / 2);
		state.endp = new UXPoint( state.background.width, state.background.height / 2);
		var f = _layout.layout( new ActParameter( 0., jp.ize.ux.acts.ActTransition.Linear ) );
		f ( state ); 
	}
	// }}}
}
// }}}
// {{{ class UXButtonResizeInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonResizeInteraction クラス<br>
 * ボタンの大きさを変更するデフォルトインタラクションです。
 */
class UXButtonResizeInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
// {{{ class UXButtonEnableInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonEnableInteraction クラス<br>
 * 有効/無効を切り替えるデフォルトインタラクションです。
 */
class UXButtonEnableInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
// {{{ class UXButtonVisibilityInteraction extends UXInteraction<UXButtonState>
/**
 * UXButtonVisibilityInteraction クラス<br>
 * 表示/非表示に対するインタラクションです。
 */
class UXButtonVisibilityInteraction extends UXInteraction<UXButtonState>
{
}
// }}}
